"""
宿舍内务计算
宿舍内务根据难度分为几个等级，每完成一项任务就可以累计对应等级的分数。等级和分数对应关系如下：
1级：擦桌子、椅子、窗户 - 对应1分
2级：扫地、拖地 - 对应2分
3级：扫厕所 - 对应3分
4级：帮全宿舍打饭 - 对应4分
5级：帮全宿舍签到 - 对应5分

编写一个Python程序，先读取“宿舍老大的内务记录.txt”文件，获取所有已填写的信息（字典格式），文件不存在则创建空字典用于记录
然后让用户输入自己完成的宿舍内务任务和完成次数。
将信息存储到字典中，以：{任务: 次数} 的格式存储，如果任务已经存在则累加次数，如果任务不存在则添加新的任务。
将任务记录更新到 “宿舍老大的内务记录.txt” 文件中，统计并显示用户总共完成每项任务的次数和总分。
程序结束

编程思路提示：
实现步骤：try方式读取文件 - eval转换为字典 - 接收用户输入 - 更新字典次数 - 计算分数 - str方式转换字典为字符串 - 保存到文件
使用with open来操作文件。
读取文件时，将字符串转换回字典，用 eval 函数。
写入文件前，将字典转换为字符串，用 str 函数。
任务和分数的对应字典用：
    task_scores = {'擦桌子': 1, '擦椅子': 1, '擦窗户': 1, '扫地': 2, '拖地': 2, '扫厕所': 3, '帮全宿舍打饭': 4, '帮全宿舍签到': 5}
"""
import json
from pathlib import Path


class DormTaskManager:
    """宿舍内务管理类"""

    # 定义任务等级和分数对应关系
    TASK_SCORES = {
        "擦桌子": 1, "擦椅子": 1, "擦窗户": 1,
        "扫地": 2, "拖地": 2,
        "扫厕所": 3,
        "帮全宿舍打饭": 4,
        "帮全宿舍签到": 5
    }

    def __init__(self, filename="宿舍老大的内务记录.txt"):
        """初始化，读取或创建记录文件"""
        self.filename = filename
        self.tasks = self.load_tasks()

    def load_tasks(self):
        """从文件加载任务记录"""
        try:
            if Path(self.filename).exists():
                with open(self.filename, 'r', encoding='utf-8') as f:
                    return json.load(f)
            return {}
        except Exception as e:
            print(f"读取文件时出错: {str(e)}")
            return {}

    def save_tasks(self):
        """保存任务记录到文件"""
        try:
            with open(self.filename, 'w', encoding='utf-8') as f:
                json.dump(self.tasks, f, ensure_ascii=False, indent=4)
            print("\n记录已成功保存到文件")
        except Exception as e:
            print(f"保存文件时出错: {str(e)}")

    def add_task(self, task_name, count):
        """添加或更新任务记录"""
        if task_name not in self.TASK_SCORES:
            print(f"错误: '{task_name}' 不是有效的任务名称")
            return False

        # 更新任务次数
        if task_name in self.tasks:
            self.tasks[task_name] += count
        else:
            self.tasks[task_name] = count
        return True

    def calculate_total_score(self):
        """计算总分"""
        total_score = 0
        for task, count in self.tasks.items():
            if task in self.TASK_SCORES:
                total_score += self.TASK_SCORES[task] * count
        return total_score

    def display_summary(self):
        """显示任务统计信息"""
        print("\n任务完成统计：")
        print("-" * 40)
        print(f"{'任务名称':<12}{'完成次数':<8}{'单次分数':<8}{'总分':<8}")
        print("-" * 40)

        for task, count in sorted(self.tasks.items()):
            if task in self.TASK_SCORES:
                score = self.TASK_SCORES[task]
                total = score * count
                print(f"{task:<12}{count:<8}{score:<8}{total:<8}")

        print("-" * 40)
        print(f"总分：{self.calculate_total_score()}")


def main():
    manager = DormTaskManager()

    print("欢迎使用宿舍内务记录系统")
    print("\n可用的任务列表：")
    for task, score in DormTaskManager.TASK_SCORES.items():
        print(f"{task} - {score}分")

    while True:
        print("\n请输入任务信息（输入'退出'结束）：")
        task_name = input("任务名称: ").strip()

        if task_name == '退出':
            break

        if task_name not in DormTaskManager.TASK_SCORES:
            print("无效的任务名称，请重新输入")
            continue

        try:
            count = int(input("完成次数: "))
            if count <= 0:
                print("次数必须是正整数")
                continue
        except ValueError:
            print("请输入有效的数字")
            continue

        if manager.add_task(task_name, count):
            print(f"已添加: {task_name} x {count}")

    # 保存并显示统计信息
    manager.save_tasks()
    manager.display_summary()


if __name__ == "__main__":
    main()